package co.edu.poli.ficb.agl.automatable.modelo.automatas;

import java.util.Set;
import java.util.TreeSet;

/**
 * @author  Diego David Satoba Castro
 * @version  0.1 27/07/11
 * @since  0.1
 */
public class EstadoCompuesto extends EstadoAdapter {
	
	/**
	 * @uml.property  name="etiqueta"
	 */
	private String etiqueta;
	
	/**
	 * @uml.property  name="estados"
	 * @uml.associationEnd  multiplicity="(0 -1)" elementType="co.edu.poli.ficb.agl.automatable.modelo.automatas.Estado"
	 */
	private Set<Estado> estados;
	
	public EstadoCompuesto(Set<Estado> estados) {
		this.estados = estados;
		reconstruirEtiqueta();
	}
	public EstadoCompuesto(Estado estado) {
		estados = new TreeSet<Estado>();
		estados.add(estado);
		reconstruirEtiqueta();
	}
	
	public EstadoCompuesto() {
		this(new TreeSet<Estado>());
	}
	
	public void agregarEstado(Estado estado) {
		this.estados.add(estado);
		reconstruirEtiqueta();
	}

	private void reconstruirEtiqueta() {
		StringBuffer sb = new StringBuffer();
		for (Estado estado : estados) {
			sb.append(","+estado.getEtiqueta());
		}
		if (estados.size() > 1)
			etiqueta = "{"+(sb.length()>0?sb.substring(1):"")+"}";
		else 
			etiqueta = sb.substring(1);
	}

	/**
	 * @return
	 * @uml.property  name="etiqueta"
	 */
	@Override
	public String getEtiqueta() {
		return etiqueta;
	}

	@Override
	public int compareTo(Estado other) {
		return getEtiqueta().compareTo(other.getEtiqueta());
	}
	
	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Estado)
			return this.getEtiqueta().equals(((Estado) obj).getEtiqueta());
		return false;
	}
	
	@Override
	public String toString() {
		return etiqueta;
	}

	/**
	 * @param estados
	 * @uml.property  name="estados"
	 */
	public void setEstados(Set<Estado> estados) {
		this.estados = estados;
	}

	/**
	 * @return
	 * @uml.property  name="estados"
	 */
	public Set<Estado> getEstados() {
		return estados;
	}	
}
